NFS squash特性相关

  • ~1.89K 字
  • 次阅读

胡言乱语

写这篇文章是因为之前写的那个samba的想到了。顺带整理下。

在阅读这篇文章之前你需要了解

  1. Linux是多用户操作系统
  2. 用户以及组的保存都是基于id(uid gid)
  3. root 的 uid 是 0,root group 的 gid 是 0,系统自带的gid在/etc/group里可以看,但是不同的Linux版本可能会有不同
  4. 目录服务(Directory service) https://zh.wikipedia.org/wiki/%E7%9B%AE%E5%BD%95%E6%9C%8D%E5%8A%A1
  5. NIS Server
  6. LDAP Server: https://linux.vbird.org/linux_server/rocky9/0240ldap.php | Arch Wiki
  7. Kerberos (Attention,我知道这个是AD域主要的验证方式,具体见https://docs.microsoft.com/en-us/windows-server/security/kerberos/kerberos-authentication-overview, Kerberos。但我目前的理解是Kerberos并不在NIS中使用,这个条目可能甚至跟整篇文章无关,但是NFS可以使用Kerberos进行验证)

squash

众所周知
no_root_squash、root_squash、all_squash
但是所有文章只说了 root 帐户是否被映射为 nobody,root_squash 是把 root 映射为 nobody。那么问题来了,其他用户呢?

Linux 是多用户操作系统。所以,其他用户如字面意思,不会被映射为 nobody。这也是我踩得一个坑(

不同 Linux 系统可能会创建不同 uid 的用户,比较常用的是 500 和 1000,在不同系统中,不同的第一个普通用户可能使用同一个 uid,在 Linux 下则意味着 NFS 挂载后你具有相同权限,由于普通的 NFS 挂载是只验证 IP(基本很多人都是直接开一个网段)。因此这样就绕过了本机验证,他可以随便把挂载出来的东西全删了。为了避免这个情况,才有了 squash。把 root 映射为 nobody 仅仅是为了不让你把东西都删了,或者在挂载出来的目录里瞎搞。不是为了让你把文件夹改成 777 好让别人用 root 创建 nobody 文件。

另外这几个设置,要配合 NIS 和 LDAP 来看。也就是集中式认证。(做同样类似事的还有微软的 AD,AD 同样也能拿来做集中式认证) 可以参考Redhat 的文档

在多台Linux中,集中式认证保证了用户以及组 ID 一致,然后挂载 NFS 确保相关的权限统一。

如果你没做这些,你就只要用 all_squash 就好了,别的你都不用仔细理解,除非你是 root everything 的用户。这样可以避免客户端在文件夹里搞出奇怪的权限问题,还有各种奇怪的 uid。

不过这里有另一点要说明,如果希望同时在 server 端和 client 端协作使用的话(仅限个人)。可能会需要 no_root_squash,否则客户端没有 root 权限的话,会没法修改文件权限。 (其实个人用 Linux 的话,我感觉你能用 samba 就用 samba 吧,哪怕是两台Linux。基于IP的验证其实还是适合企业用)。多人协作环境的话,一定要上 LDAP 之类的,也好进行权限管理。

另请参考 ACL

早期 AD 用的比较多,因此没弄清楚 ldap 这些,水平不够,这篇文章写的不少问题,可能让人笑掉了大牙。现在可能还有很多问题叙述没有纠正过来。

扩展阅读

NIS+

Directory service

目录是一个特殊的数据库,它的数据经常被查询,但是不经常更新。不像普通的数据库,目录不包括对事件(transaction)的支持也不包括回滚特性。目录是很容易被复制的,以便增加它的可用性和可靠性。当目录被复制时,临时的数据不一致情况是允许出现的,只要最终这些数据得到同步即可。

其他注意事项

NFS 尽量不要挂载到根目录下的一级目录下,因为网络系统的不稳定性,这种挂载一旦不成功很可能导致根目录下的很多操作卡死(除非这台机子设计上就是强依赖 NFS 主机运作的)。其实还是比较推荐 autofs,这样也不会因为 nfs 主机没开机导致机子开不起来。


加深了对系统理解,不再强调 Linux 是多用户系统,增加 ldap 的说明

打赏
打赏提示信息
分享
分享提示信息